package org.wheel.example;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.wheel.plugins.toolkit.jdbc.pool.util.DynamicJdbcPoolUtil;

/**
 * 事务使用示例
 */
@Service
public class TransactionExample {

    @Autowired
    private DynamicJdbcPoolUtil dynamicJdbcPoolUtil;

    /**
     * 使用事务注解的方法
     */
    @Transactional
    public void transactionalOperation(String dataSourceName) {
        // 获取指定数据源的JdbcTemplate
        dynamicJdbcPoolUtil.getJdbcTemplate(dataSourceName)
                .update("INSERT INTO example_table (name) VALUES (?)", "test");
        
        // 其他数据库操作，如果发生异常会自动回滚
    }

    /**
     * 不使用事务的方法
     */
    public void nonTransactionalOperation() {
        // 直接使用JdbcTemplate进行操作
        dynamicJdbcPoolUtil.getDefaultJdbcTemplate()
                .update("INSERT INTO example_table (name) VALUES (?)", "test");
    }
    // 在 TransactionExample.java 中添加以下方法


    @Transactional
    public void combinedTransactionalOperation(String dataSourceName) {
        // 执行第一个操作
        transactionalOperation(dataSourceName);

        // 执行第二个操作（会抛出异常）
        transactionalOperationWithException(dataSourceName);
    }

    /**
     * 使用事务注解但会抛出异常的方法
     */
    @Transactional
    public void transactionalOperationWithException(String dataSourceName) {
        // 插入一条记录
        dynamicJdbcPoolUtil.getJdbcTemplate(dataSourceName)
                .update("INSERT INTO example_table (name) VALUES (?)", "test1");

        dynamicJdbcPoolUtil.getJdbcTemplate(dataSourceName)
                .update("INSERT INTO example_table (name) VALUES (?)", "test3");
        // 强制抛出异常触发回滚
        throw new RuntimeException("模拟异常以测试事务回滚");
    }

    /**
     * 不使用事务但会抛出异常的方法
     */
    public void nonTransactionalOperationWithException(String dataSourceName) {
        // 插入一条记录
        dynamicJdbcPoolUtil.getJdbcTemplate(dataSourceName)
                .update("INSERT INTO example_table (name) VALUES (?)", "test2");

        // 强制抛出异常
        throw new RuntimeException("模拟异常");
    }

}
